home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-06-21 | 19.7 KB | 722 lines | [TEXT/CWIE] |
- //===================================================================
- //======================= Headers =============================
-
- #include "Blitters.h"
- #include "GameUtilities.h"
-
- //===================================================================
- //======================= Globals =============================
-
-
- //===================================================================
- //======================= #define =============================
-
-
- //===================================================================
- //======================= Function Prototypes =====================
-
-
- /*----------------------------------------------------------------------------\
-
- PaintRect
-
- - makes everything with in that rect that color
-
- \----------------------------------------------------------------------------*/
-
- void PaintRect( OffScreenBuff *buff, const rect *r , ushort color )
- {
- ulong rowSize;
- ushort *pixPtr , *rowStart;
- short x;
- short y;
-
- rowSize = buff->GetRowSize();
-
- (char *)rowStart = (char *)buff->GetSrcPtr() + r->top * rowSize + r->left * sizeof( short );
-
- for( y = r->top; y < r->bottom; y++ )
- {
- pixPtr = rowStart;
-
- for( x = r->left; x < r->right; x++ )
- {
- *pixPtr = color;
-
- pixPtr++;
- }
-
- (char *)rowStart += rowSize;
- }
- }
-
-
- /*----------------------------------------------------------------------------\
-
- DrawPicture
-
- - it asumes the rectangles are the same size
-
- \----------------------------------------------------------------------------*/
-
- int DrawGeneric( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest , const rect *destClip ,
- ushort options , uchar more , ushort color )
- {
- if( options == 0 )
- DrawPicture( srcBuff , src , destBuff , dest );
- else if( options & kDrawCrop1 )
- {
- DrawGenericCliped1( srcBuff , src , destBuff , dest , destClip, options , more , color );
- }
- else if( options & kDrawTransparent )
- {
- if( options & kDrawCrop2 )
- {
- DrawClipedPicture2( srcBuff , src , destBuff , dest , destClip );
- }
- else if( options & kDrawTranslucent )
- {
- DrawClearTranslu( srcBuff , src , destBuff , dest , more );
- }
- else
- {
- // for now assume it wants a plain copy
- DrawClearPic( srcBuff , src , destBuff , dest );
- }
- }
- else if( options & kDrawInverse )
- {
- DrawPictureInverse( srcBuff , src , destBuff , dest );
- }
- else if( options & kDrawTint )
- {
- DrawPictureTint( srcBuff , src , destBuff , dest , more , color );
- }
- else
- {
- return -1; // not suppoorted
- }
-
- return 0;
-
-
- }
- /*----------------------------------------------------------------------------\
-
- DrawPicture
-
- - it asumes the rectangles are the same size
-
- \----------------------------------------------------------------------------*/
-
- void DrawPicture( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest )
- {
- ulong srcRowSize;
- ulong destRowSize;
- ushort *srcPtr , *srcRowStart;
- ushort *destPtr , *destRowStart;
- short y;
- ulong amountLeft;
- ulong amountInRow;
-
- srcRowSize = srcBuff->GetRowSize();
- destRowSize = destBuff->GetRowSize();
-
- (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( short );
- (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( short );
-
- amountInRow = (dest->right - dest->left) * sizeof( short );
-
- for( y = dest->top; y < dest->bottom; y++ )
- {
- srcPtr = srcRowStart;
- destPtr = destRowStart;
-
- amountLeft = amountInRow;
-
- // while( amountLeft > sizeof( double ) )
- // {
- // *((double *)destPtr)++ = *((double *)srcPtr)++;
- // amountLeft -= sizeof(double);
- // }
-
- while( amountLeft > sizeof( long ) )
- {
- *((long *)destPtr)++ = *((long *)srcPtr)++;
- amountLeft -= sizeof(long);
- }
-
- while( amountLeft >= sizeof( short ) )
- {
- *((short *)destPtr)++ = *((short *)srcPtr)++;
- amountLeft -= sizeof(short);
- }
-
-
- /* for( x = dest->left; x < dest->right; x++ )
- {
- *destPtr = *srcPtr;
-
- destPtr++;
- srcPtr++;
- } */
-
- (char *)srcRowStart += srcRowSize;
- (char *)destRowStart += destRowSize;
- }
-
- // CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
- // & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
- }
-
- /*----------------------------------------------------------------------------\
-
- DrawPictureInverse
-
- - draws the inverse of the color in the src onto the dest
-
- \----------------------------------------------------------------------------*/
-
- void DrawPictureInverse( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest )
- {
- ulong srcRowSize;
- ulong destRowSize;
- ushort *srcPtr , *srcRowStart;
- ushort *destPtr , *destRowStart;
- short x;
- short y;
-
- srcRowSize = srcBuff->GetRowSize();
- destRowSize = destBuff->GetRowSize();
-
- (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( short );
- (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( short );
-
- for( y = dest->top; y < dest->bottom; y++ )
- {
- srcPtr = srcRowStart;
- destPtr = destRowStart;
-
- for( x = dest->left; x < dest->right; x++ )
- {
- *destPtr = ~*srcPtr;
-
- destPtr++;
- srcPtr++;
- }
-
- (char *)srcRowStart += srcRowSize;
- (char *)destRowStart += destRowSize;
- }
-
- // CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
- // & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
- }
-
- /*----------------------------------------------------------------------------\
-
- DrawPictureTint
-
- - tinks the src the color specified to the mag specified (0-31)
- \----------------------------------------------------------------------------*/
-
- void DrawPictureTint( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest ,
- uchar mag , ushort color )
- {
- ulong srcRowSize;
- ulong destRowSize;
- ushort *srcPtr , *srcRowStart;
- ushort *destPtr , *destRowStart;
- short x;
- short y;
-
- ulong result,a,b;
- uchar bMag;
-
- srcRowSize = srcBuff->GetRowSize();
- destRowSize = destBuff->GetRowSize();
-
- (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( short );
- (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( short );
-
- mag &= 0x1f; // make sure it is 0 to 31
- bMag = 32 - mag;
-
- for( y = dest->top; y < dest->bottom; y++ )
- {
- srcPtr = srcRowStart;
- destPtr = destRowStart;
-
- for( x = dest->left; x < dest->right; x++ )
- {
- //*destPtr = *srcPtr & 0x6318;
- a = (color & 0x03e0 ) << 15;
- a |= (color & 0x7c1f );
-
- b = (*srcPtr & 0x03e0 ) << 15;
- b |= (*srcPtr & 0x7c1f );
-
- result = ((a * mag) + (b * (bMag))) >> 5;
- result = (result & 0x00007c1f ) | ((result & 0x01f00000 ) >> 15);
-
- *destPtr = result;//*destPtr = *srcPtr;
-
- destPtr++;
- srcPtr++;
- }
-
- (char *)srcRowStart += srcRowSize;
- (char *)destRowStart += destRowSize;
- }
-
- // CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
- // & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
- }
- /*----------------------------------------------------------------------------\
-
- DrawTranslu
-
- - normal draw, except it is transulcent
-
- \----------------------------------------------------------------------------*/
-
- void DrawTranslu( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest , uchar mag)
- {
-
- ulong srcRowSize;
- ulong destRowSize;
- short *srcPtr , *srcRowStart;
- short *destPtr , *destRowStart;
- short x;
- short y;
-
- ulong result,a,b;
- uchar bMag;
-
- srcRowSize = srcBuff->GetRowSize();
- destRowSize = destBuff->GetRowSize();
-
-
- (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
- (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
-
- mag &= 0x1f; // make sure it is 0 to 31
- bMag = 32 - mag;
-
- for( y = dest->top; y < dest->bottom; y++ )
- {
- srcPtr = srcRowStart;
- destPtr = destRowStart;
-
- for( x = dest->left; x < dest->right; x++ )
- {
- //*destPtr = *srcPtr & 0x6318;
- a = (*srcPtr & 0x03e0 ) << 15;
- a |= (*srcPtr & 0x7c1f );
-
- b = (*destPtr & 0x03e0 ) << 15;
- b |= (*destPtr & 0x7c1f );
-
- result = ((a * mag) + (b * (bMag))) >> 5;
- result = (result & 0x00007c1f ) | ((result & 0x01f00000 ) >> 15);
-
- *destPtr = result;//*destPtr = *srcPtr;
-
- destPtr++;
- srcPtr++;
- }
-
- (char *)srcRowStart += srcRowSize;
- (char *)destRowStart += destRowSize;
- }
-
- // CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
- // & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
- }
-
- /*
- whyte: your average 16bit pixel looks like this ARRRRRGGGGGBBBBB...but to do this you need to use
- 32bit values...so your average 16 bit pixel would look like this (dropping the alpha)
- 00000000000000000RRRRRGGGGGBBBBB
-
- whyte: first thing you do is convert it to the form: 0000000GGGGG00000RRRRR00000BBBBB...can do
- that fast with a couple shifts/ands/ors
-
- whyte: you do that for both pixels, lets call them pixelA and pixelB
-
- whyte: then, resultPixel = ((pixelA * intensity) + (pixelB * (32 - intensity))) >> 5
-
- whyte: then, you convert resultPixel from XXXXXXXGGGGGXXXXXRRRRRXXXXXBBBBB back to
- 0RRRRRGGGGGBBBBB and you have a neat and really fast way to combine any two pixels
- with 32 levels of translucency
-
- whyte: you can actually that whole operation in about 8 instructions, if your smart and watch how you code it very carefully
- whyte: er, code taht whole...
-
- whyte: btw, intensity must be 0 >= x <= 32
-
-
- ulong pix32 = (pix16 & 0x781f ) << 15;
-
- pix32 ^= (pix16 & 0x03e0 );
-
-
-
- */
-
- /*----------------------------------------------------------------------------\
-
- DrawClearPic
-
- \----------------------------------------------------------------------------*/
-
- void DrawClearPic( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest )
- {
- ulong srcRowSize;
- ulong destRowSize;
- short *srcPtr , *srcRowStart;
- short *destPtr , *destRowStart;
- short x;
- short y;
-
-
- srcRowSize = srcBuff->GetRowSize();
- destRowSize = destBuff->GetRowSize();
-
- (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
- (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
-
- for( y = dest->top; y < dest->bottom; y++ )
- {
- srcPtr = srcRowStart;
- destPtr = destRowStart;
-
- for( x = dest->left; x < dest->right; x++ )
- {
- if( *srcPtr != 0x7fff)
- {
- *destPtr = *srcPtr;
- }
-
- destPtr++;
- srcPtr++;
- }
-
- (char *)srcRowStart += srcRowSize;
- (char *)destRowStart += destRowSize;
- }
-
- // CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
- // & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
- }
-
- /*----------------------------------------------------------------------------\
-
- DrawClearPicColor
-
- - it doesnt draw the kClearColor
- - it tints it the color that is specified
-
- *** THIS ISNT DONE YET *****
- \----------------------------------------------------------------------------*/
-
- void DrawClearPicColor( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest ,
- ushort color )
- {
- ulong srcRowSize;
- ulong destRowSize;
- short *srcPtr , *srcRowStart;
- short *destPtr , *destRowStart;
- short x;
- short y;
-
-
- srcRowSize = srcBuff->GetRowSize();
- destRowSize = destBuff->GetRowSize();
-
- (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
- (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
-
- for( y = dest->top; y < dest->bottom; y++ )
- {
- srcPtr = srcRowStart;
- destPtr = destRowStart;
-
- for( x = dest->left; x < dest->right; x++ )
- {
- if( *srcPtr != kBackGroundColor)
- {
- *destPtr = color;
- }
-
- destPtr++;
- srcPtr++;
- }
-
- (char *)srcRowStart += srcRowSize;
- (char *)destRowStart += destRowSize;
- }
-
- // CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
- // & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
- }
-
- /*----------------------------------------------------------------------------\
-
- DrawClearPicTint
-
- \----------------------------------------------------------------------------*/
-
- void DrawClearPicTint( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest ,
- uchar mag , ushort color )
- {
- ulong srcRowSize;
- ulong destRowSize;
- short *srcPtr , *srcRowStart;
- short *destPtr , *destRowStart;
- short x;
- short y;
-
- ulong result,a,b;
- uchar bMag;
-
- srcRowSize = srcBuff->GetRowSize();
- destRowSize = destBuff->GetRowSize();
-
- (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
- (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
-
- mag &= 0x1f; // make sure it is 0 to 31
- bMag = 32 - mag;
-
- for( y = dest->top; y < dest->bottom; y++ )
- {
- srcPtr = srcRowStart;
- destPtr = destRowStart;
-
- for( x = dest->left; x < dest->right; x++ )
- {
- if( *srcPtr != kBackGroundColor)
- {
- a = (color & 0x03e0 ) << 15;
- a |= (color & 0x7c1f );
-
- b = (*srcPtr & 0x03e0 ) << 15;
- b |= (*srcPtr & 0x7c1f );
-
- result = ((a * mag) + (b * (bMag))) >> 5;
- result = (result & 0x00007c1f ) | ((result & 0x01f00000 ) >> 15);
-
- *destPtr = result;//*destPtr = *srcPtr;
- }
-
- destPtr++;
- srcPtr++;
- }
-
- (char *)srcRowStart += srcRowSize;
- (char *)destRowStart += destRowSize;
- }
-
- // CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
- // & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
- }
-
- /*----------------------------------------------------------------------------\
-
- DrawClearTranslu
-
- - draw on with skiping white color, translucent, mag = 0 to 31
- \----------------------------------------------------------------------------*/
-
- void DrawClearTranslu( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest , uchar mag)
- {
- ulong srcRowSize;
- ulong destRowSize;
- short *srcPtr , *srcRowStart;
- short *destPtr , *destRowStart;
- short x;
- short y;
-
- ulong result,a,b;
- uchar bMag;
-
- srcRowSize = srcBuff->GetRowSize();
- destRowSize = destBuff->GetRowSize();
-
-
- (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
- (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
-
- mag &= 0x1f; // make sure it is 0 to 31
- bMag = 32 - mag;
-
- for( y = dest->top; y < dest->bottom; y++ )
- {
- srcPtr = srcRowStart;
- destPtr = destRowStart;
-
- for( x = dest->left; x < dest->right; x++ )
- {
- if( *srcPtr != kBackGroundColor)
- {
- a = (*srcPtr & 0x03e0 ) << 15;
- a |= (*srcPtr & 0x7c1f );
-
- b = (*destPtr & 0x03e0 ) << 15;
- b |= (*destPtr & 0x7c1f );
-
- result = ((a * mag) + (b * (bMag))) >> 5;
- result = (result & 0x00007c1f ) | ((result & 0x01f00000 ) >> 15);
-
- *destPtr = result;
- }
-
- destPtr++;
- srcPtr++;
- }
-
- (char *)srcRowStart += srcRowSize;
- (char *)destRowStart += destRowSize;
- }
-
- // CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
- // & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
-
- }
-
-
- /*----------------------------------------------------------------------------\
-
- DrawClipedPictureClear
-
- - Clip 1, except it skips the kClearColor and does translucent
-
- \----------------------------------------------------------------------------*/
-
- void DrawGenericCliped1( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest , const rect *destClip ,
- ushort options , uchar more , ushort color )
- {
-
- rect newSrc, newDest;
-
- // need to check if they intersect *Kinda HAck*
- if( !MySectRect( dest , destClip ) )
- return;
-
- newDest.left = ( dest->left > destClip->left ) ? dest->left : destClip->left;
- newDest.right = ( dest->right < destClip->right ) ? dest->right : destClip->right;
- newDest.top = ( dest->top > destClip->top ) ? dest->top : destClip->top;
- newDest.bottom = ( dest->bottom < destClip->bottom ) ? dest->bottom : destClip->bottom;
-
- newSrc = *src;
-
-
- newSrc.left += ( dest->left < destClip->left ) ? destClip->left - dest->left : 0;
- newSrc.right -= ( dest->right > destClip->right ) ? dest->right - destClip->right : 0;
- newSrc.top += ( dest->top < destClip->top ) ? destClip->top - dest->top : 0;
- newSrc.bottom -= ( dest->bottom > destClip->bottom ) ? dest->bottom - destClip->bottom : 0;
-
-
- if( options & kDrawTransparent )
- {
- if( options & kDrawTranslucent )
- DrawClearTranslu( srcBuff , &newSrc , destBuff , &newDest , more );
- else if( options & kDrawColorize )
- DrawClearPicColor( srcBuff , &newSrc , destBuff , &newDest , color );
- else if( options & kDrawTint )
- DrawClearPicTint( srcBuff , &newSrc , destBuff , &newDest , more , color );
- else
- DrawClearPic( srcBuff , &newSrc , destBuff , &newDest );
- }
- else if( options & kDrawTranslucent )
- {
- DrawTranslu( srcBuff , &newSrc , destBuff , &newDest , more );
- }
- else if( options & kDrawInverse )
- {
- DrawPictureInverse( srcBuff , &newSrc , destBuff , &newDest );
- }
- else if( options & kDrawTint )
- {
- DrawPictureTint( srcBuff , &newSrc , destBuff , &newDest , more , color );
- }
- else
- {
- DrawPicture( srcBuff , &newSrc , destBuff , &newDest );
- }
- }
- /*----------------------------------------------------------------------------\
-
- DrawClipedPicture
-
- - this asumes the src and the clip are the same size and adjustes the src
-
- \----------------------------------------------------------------------------*/
-
- void DrawClipedPicture2( OffScreenBuff *srcBuff, const rect *src ,
- OffScreenBuff *destBuff , const rect *dest ,
- const rect *destClip)
- {
- rect newSrc, newDest;
- ulong srcRowSize;
- ulong destRowSize;
- ushort *srcPtr , *srcRowStart;
- ushort *destPtr , *destRowStart;
- short x;
- short y;
-
-
- newDest.left = ( dest->left > destClip->left ) ? dest->left : destClip->left;
- newDest.right = ( dest->right < destClip->right ) ? dest->right : destClip->right;
- newDest.top = ( dest->top > destClip->top ) ? dest->top : destClip->top;
- newDest.bottom = ( dest->bottom < destClip->bottom ) ? dest->bottom : destClip->bottom;
-
- newSrc = *src;
-
-
- newSrc.left += ( destClip->left < dest->left ) ? dest->left - destClip->left : 0;
- newSrc.right -= ( destClip->right > dest->right ) ? destClip->right - dest->right : 0;
- newSrc.top += ( destClip->top < dest->top ) ? dest->top - destClip->top : 0;
- newSrc.bottom -= ( destClip->bottom > dest->bottom ) ? destClip->bottom - dest->bottom : 0;
-
-
- // CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
- // & rToR( newSrc ), & rToR( newDest ), srcCopy , (RgnHandle)nil );
-
-
- srcRowSize = srcBuff->GetRowSize();
- destRowSize = destBuff->GetRowSize();
-
- (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + newSrc.top * srcRowSize + newSrc.left * sizeof( ushort );
- (char *)destRowStart = (char *)destBuff->GetSrcPtr() + newDest.top * destRowSize + newDest.left * sizeof( ushort );
-
- for( y = newDest.top; y < newDest.bottom; y++ )
- {
- srcPtr = srcRowStart;
- destPtr = destRowStart;
-
- for( x = newDest.left; x < newDest.right; x++ )
- {
- *destPtr = *srcPtr;
-
- destPtr++;
- srcPtr++;
- }
-
- (char *)srcRowStart += srcRowSize;
- (char *)destRowStart += destRowSize;
- }
-
- }
-